/** @类 解析类 */
export class Parser {
  constructor() {
    this.scale = {
      rate: 1, // 计算最小缩放率（背景不超出画布）
      scaling: 1, // 当前缩放比例
      step: 0.1, // 缩放步长
      min: 1, // 最小缩放比例
      max: 10, // 最大缩放比例
    };
    this.wrapper = {
      lineWidth: 2,
      lineColor: 'rgba(255, 255, 255, 0.5)', // 线段颜色
      backgroundColor: 'rgba(0, 0, 0, 0.5)', // 遮罩颜色
    };
    this.background = {
      src: '', // 背景图片
      image: null, // 背景图片对象
      width: 0, // 背景宽度
      height: 0, // 背景高度
      offsetX: 0, // 偏移坐标X
      offsetY: 0, // 偏移坐标Y
    };
    this.stages = [];
    this.activeStage = null;
  }

  /** @方法 加载项目 */
  load({ data, observer, renderer }) {
    this.scale = {
      ...data.scale,
      rate: renderer.width / data.background.width, // 计算最小缩放率（背景不超出画布）
    };
    this.stages = data.stages.filter(v => v.polygon.length > 0);
    this.wrapper = {
      ...data.wrapper,
    };
    this.background = {
      ...data.background,
      image: null,
    };
    this.activeStage = null;
    this.GetBackground(this.background);
    observer.dispatch('loaded', this);
  }

  /** @方法 取消点击地块 */
  unStage() {
    this.activeStage = null;
  }

  /** @方法 获取点击地块 */
  clickStage(point) {
    const { x, y } = point;
    this.activeStage = this.stages.find(({ polygon }) => {
      let inside = false;
      for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
        const xi = polygon[i].x;
        const yi = polygon[i].y;
        const xj = polygon[j].x;
        const yj = polygon[j].y;

        if (((yi > y) !== (yj > y)) && (x < ((xj - xi) * (y - yi)) / (yj - yi) + xi)) {
          inside = !inside;
        }
      }
      return inside;
    });
    return this.activeStage;
  }

  /** @辅助 加载背景 */
  GetBackground(background) {
    if (this.background.src) {
      const image = new Image();
      image.src = background.src;
      image.addEventListener('load', () => (background.image = image));
    }
  }
}

export default Parser;
